package com.it.jiang.Service.Impl;


import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.AES;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.it.jiang.Dao.User;
import com.it.jiang.Mapper.UserMapper;
import com.it.jiang.Service.UserBaseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;


@Service
public class UserServicdeImpl implements UserBaseService {
    @Autowired
    private UserMapper userMapper;


    @Override
    public void mp() {
        QueryWrapper qw = new QueryWrapper();
        User user = new User();
        qw.eq("id", "1");   // eq 等于   id等于1
        qw.or();   //或者
        qw.ne("name","老六"); //ne 不等于  name不为老六
        qw.gt("age",18);     //gt 大于   年龄大于18岁
        qw.ge("age",18);     //ge 大于等于  年龄大于等于18岁
        qw.lt("age",20);     //lt 小于      年龄小于20
        qw.le("age",20);     //le 小于等于   年龄小于等于20
      //  qw.and();
        qw.between("age",18,20); //between 在18-20之间
        qw.notBetween("age",30,50); //notBetween 不在30-50之间
        qw.like("name","刘");      // like '%值%'
        qw.notLike("name","王");   //notlike '%值%'
        qw.likeLeft("name","刘");  // like ‘%值’
        qw.likeRight("name","刘");  //like '值%'
        qw.isNull("name");         //name is null
        qw.isNotNull("id");        //id is not null
        List<Integer> list = Arrays.asList(1,2,3,4);
        qw.in("age", new int[]{1, 2, 3, 4});  //age 在1234中 注意传入的值要数组
        qw.in("age", list);
        qw.in("age", 1,2,3,4);
        qw.notIn("age",1,2,3,4);
        //id in (select id from table where id < 3)
        qw.inSql("age", "select id from table where id < 3");
        //id not in (select id from table where id < 3)
        qw.notInSql("age","select id from table where id < 3");
        qw.groupBy("id","name","age");  //groupby id name age
        qw.orderByAsc("id");       //id正序排序
        qw.orderByDesc("age");     //age倒叙排序
        qw.having("sum(age)>10");   //having sum(age) > 10
        qw.having("sum(age) > {0}", 11);  //having sum(age) > 11
        qw.last("limit 1");   //无视优化规则直接拼接到 sql 的最后
        qw.exists("select id from table where age = 1");  //exists (select id from table where age = 1)
        qw.notExists("select id from table where age = 1"); //not exists (select id from table where age = 1)


        qw.select("id","name","max(age)");
        String data = "";
        String randomKey = AES.generateRandomKey();
        String result = AES.encrypt(data, randomKey);
        UpdateWrapper up = new UpdateWrapper();
        up.set("name","66");
        up.set("name", "");   //数据库字段值变为空字符串
        up.set("name", null); //    数据库字段值变为null
        up.setSql("name = '老李头'");
    }

    @Override
    public JSONObject jsontest() {
       JSONObject jso = new JSONObject(); //本质就是一个map<String,Object>  初始大小为16
       JSONObject jsomap = new JSONObject(true); //为true LinkedHashMap   为 false HashMap
        //构造自定义Map<String, Object> 容器类型的JSONObject
        Map<String,Object> map = new ConcurrentHashMap<>(16);
        JSONObject jsonselectMap = new JSONObject(map);
        //自定义
        JSONObject jsoo = new JSONObject(32, false);
        //这里我们用jso进行模拟，首先我们现拿到一个json
        jso.size();   //查看map内key-value的数量
        jso.isEmpty();  //是否为空
        jso.containsKey("江");  //key是否包含江
        jso.containsValue(jso.getString("Jiang"));  //是否以江为ket的value
        //todo  增加
        jso.put("Jiang","666");   //map的put同理
        HashMap<String,Object> hm = new HashMap<>();
        jso.putAll(hm);   //将hm都放入里面
        jso.putIfAbsent("jiang","77");  //如果没有就添加
        jso.fluentPut("jiang","88").fluentPut("jiang","77");   //像流一样新增，看继续调用其他方法
        jso.fluentPutAll(hm).fluentPutAll(hm);    //像流一样新增hm数组,看继续调用其他方法
        //todo  获取
        jso.get("Jiang");    //获取对应的ket和value
        jso.getString("Jiang");  //获取key为Jiang的value
        jso.getJSONObject("Jiang");   //JSONObject是一个{}包裹起来的一个对象(Object)   里面放了很多{}
        jso.getJSONArray("Jiang").get(5);  //SONArray则是[]包裹起来的一个数组(Array)  [{},{},{},{},{}]  此时为拿到第五个
        jso.keySet();                         //获取json中ket的set集合
        Set<Map.Entry<String, Object>> entries = jso.entrySet();   //获取key与value的映射关系
        //todo 删除
        jso.remove("jiang");    //删除指定的key和value
        jso.fluentRemove("jiang").fluentRemove("ll");   //像流一样清楚key value
        jso.fluentClear();   //清楚所有key value

        JSONObject jsoclone=(JSONObject)jso.clone();    //克隆一个新的jsonObject

        String jsonString = "{name:'jiang',age:'22',sex:'male',haha:'sd'}";    //haha是User类没有的
        //todo  将JSON字符串转化成对象时，会去填充名称相同的属性，对于JSON字符串中没有，而User类有的属性，会为null；
        User user2 = JSONObject.parseObject(jsonString, User.class);                 //这里是haha
        user2.toString();      //json字符串转换为自己的实体类对象  {name='jiang', age='22', email='null', sex='male'}
        //todo 将对象转化成JSON字符串时，对于JSON字符串有，但是User类没有的，不做任何处理。
        String userjson = JSONObject.toJSONString(user2); //将对象转为JSon字符串  {"age":"22","name":"jiang","sex":"male"}

        return jso;
    }



}
